import { detectTextFormat } from "../checkFormat/checkFormat";
import { FusionType } from "../enumeration/definition";

/**
 * 将内容转换为 HTML5 格式。
 *
 * @param content - 需要转换的文本内容。
 * @param currentTarget - 当前文本的目标格式类型。
 * @returns 转换后的 HTML5 格式内容。
 */
function toHtml5(content: string, currentTarget: FusionType): string {
  if (currentTarget === FusionType.MD) {
    toHtml5FromMarkdown(content)
  }
  if (currentTarget === FusionType.TXT) {
    return '暂不支持将纯文本转 H5 语法'
  }
  return content
}

/**
 * 将内容转换为 Markdown 格式。
 *
 * @param content - 需要转换的文本内容。
 * @param currentTarget - 当前文本的目标格式类型。
 * @returns 转换后的 Markdown 格式内容。
 */
function toMarkdown(content: string, currentTarget: FusionType): string {
  if (currentTarget === FusionType.H5) {
    toMarkdownFromHtml5(content)
  }
  if (currentTarget === FusionType.TXT) {
    return '暂不支持将纯文本转 Markdown 文本'
  }
  return content
}

/**
 * 将 Markdown 内容转换为 HTML5 格式。
 *
 * @param content - 需要转换的 Markdown 内容。
 * @returns 转换后的 HTML5 格式内容。
 */
function toHtml5FromMarkdown(content: string): string {
  // 多级标题
  content = content.replace(/^(#{1,6})\s*(.*?)\s*$/gm, (match, hashes, text) => {
    const level = hashes.length;
    return `<h${level}>${text}</h${level}>`;
  });

  // 加粗
  content = content.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
  content = content.replace(/__(.*?)__/g, '<strong>$1</strong>');

  // 斜体
  content = content.replace(/\*(.*?)\*/g, '<em>$1</em>');
  content = content.replace(/_(.*?)_/g, '<em>$1</em>');

  // 删除线
  content = content.replace(/~~(.*?)~~/g, '<del>$1</del>');

  // 无序列表
  content = content.replace(/^- (.*?)(\n|$)/gm, '<li>$1</li>\n').replace(/<li>(.*?)<\/li>\n/gm, (match) => {
    return `<ul>\n${match}</ul>\n`;
  });

  // 有序列表
  content = content.replace(/^(\d+)\. (.*?)(\n|$)/gm, '<li>$2</li>\n').replace(/<li>(.*?)<\/li>\n/gm, (match) => {
    return `<ol>\n${match}</ol>\n`;
  });

  // 链接
  content = content.replace(/\[(.*?)\]\((.*?)\)/g, '<a href="$2">$1</a>');

  // 图片
  content = content.replace(/!\[(.*?)\]\((.*?)\)/g, '<img src="$2" alt="$1">');

  // 水平线
  content = content.replace(/^---/gm, '<hr>');

  // 段落
  content = content.replace(/^(?!<h|<ul|<ol|<li|<p|<a|<img|<hr|<strong|<em|<del>)(.*?)(\n|$)/gm, '<p>$1</p>\n');

  return content;
}

/**
 * 将 HTML5 内容转换为 Markdown 格式。
 *
 * @param content - 需要转换的 HTML5 内容。
 * @returns 转换后的 Markdown 格式内容。
 */
function toMarkdownFromHtml5(content: string): string {
  // 多级标题
  content = content.replace(/<h1>(.*?)<\/h1>/g, '# $1\n');
  content = content.replace(/<h2>(.*?)<\/h2>/g, '## $1\n');
  content = content.replace(/<h3>(.*?)<\/h3>/g, '### $1\n');
  content = content.replace(/<h4>(.*?)<\/h4>/g, '#### $1\n');
  content = content.replace(/<h5>(.*?)<\/h5>/g, '##### $1\n');
  content = content.replace(/<h6>(.*?)<\/h6>/g, '###### $1\n');

  // 加粗
  content = content.replace(/<strong>(.*?)<\/strong>/g, '**$1**');
  content = content.replace(/<b>(.*?)<\/b>/g, '**$1**');

  // 斜体
  content = content.replace(/<em>(.*?)<\/em>/g, '*$1*');
  content = content.replace(/<i>(.*?)<\/i>/g, '*$1*');

  // 删除线
  content = content.replace(/<del>(.*?)<\/del>/g, '~~$1~~');

  // 无序列表
  content = content.replace(/<ul>\s*(<li>.*?<\/li>\s*)+<\/ul>/g, (match) => {
    return match.replace(/<li>(.*?)<\/li>/g, '- $1\n');
  });

  // 有序列表
  content = content.replace(/<ol>\s*(<li>.*?<\/li>\s*)+<\/ol>/g, (match) => {
    return match.replace(/<li>(.*?)<\/li>/g, (liMatch, index) => {
      return `${index + 1}. ${liMatch}\n`;
    });
  });

  // 链接
  content = content.replace(/<a href="(.*?)">(.*?)<\/a>/g, '[$2]($1)');

  // 图片
  content = content.replace(/<img src="(.*?)" alt="(.*?)">/g, '![ $2 ]($1)');

  // 水平线
  content = content.replace(/<hr>/g, '---\n');

  // 段落
  content = content.replace(/<p>(.*?)<\/p>/g, '$1\n\n');

  return content;
}

/**
 * 将内容转换为纯文本格式。
 *
 * @param content - 需要转换的文本内容。
 * @param currentTarget - 当前文本的目标格式类型。
 * @returns 转换后的纯文本格式内容。
 */
function toPlainText(content: string, currentTarget: FusionType): string {
  if (currentTarget === FusionType.H5) {
    return stripHtmlTags(content)
  }
  if (currentTarget === FusionType.MD) {
    return stripMarkdown(content)
  }
  return content
}

/**
 * 去除 HTML 标签。
 *
 * @param content - 需要处理的文本内容。
 * @returns 去除 HTML 标签后的文本内容。
 */
function stripHtmlTags(content: string): string {
  // 使用正则表达式匹配并删除所有 HTML 标签
  // 正则表达式解释：
  // <[^>]*>：匹配所有以 '<' 开头，以 '>' 结尾的字符串，中间可以包含任意字符（但不包括 '>'）
  // g：全局匹配，确保匹配内容中的所有 HTML 标签
  return content.replace(/<[^>]*>/g, '');
}

/**
 * 去除 Markdown 标记。
 *
 * @param content - 需要处理的文本内容。
 * @returns 去除 Markdown 标记后的文本内容。
 */
function stripMarkdown(content: string): string {
  // 去除多级标题
  content = content.replace(/^(#{1,6})\s*/gm, '');

  // 去除加粗和斜体
  content = content.replace(/\*\*/g, '');
  content = content.replace(/__/g, '');
  content = content.replace(/\*/g, '');
  content = content.replace(/_/g, '');

  // 去除删除线
  content = content.replace(/~~/g, '');

  // 去除无序列表和有序列表
  content = content.replace(/^- /g, '');
  content = content.replace(/^\+ /g, '');
  content = content.replace(/(\d+)\. /g, '');

  // 去除链接
  content = content.replace(/\[(.*?)\]\(.*?\)/g, '$1');

  // 去除图片
  content = content.replace(/!\[(.*?)\]\(.*?\)/g, '$1');

  // 去除水平线
  content = content.replace(/^---/gm, '');
  content = content.replace(/^===/gm, '');

  // 去除表格
  content = content.replace(/\n[-=]+\n/g, '\n\n');
  content = content.replace(/\n-{3,}\n/g, '\n\n');
  content = content.replace(/\n={3,}\n/g, '\n\n');

  // 去除代码块
  content = content.replace(/```.*?```/gs, '');
  content = content.replace(/`.*?`/g, '');

  // 去除脚注
  content = content.replace(/\[\^.*?\]:/g, '');

  // 去除引用
  content = content.replace(/^>/gm, '');

  return content;
}
/**
 * formatInterop - 格式互操作函数，用于在不同文本格式之间进行转换。
 *
 * 该函数是格式转换逻辑的入口点，根据指定的 FusionType 枚举值，将输入的文本内容转换为目标格式。
 *
 * @param content - 需要转换的文本内容，可以是 Markdown、HTML 或纯文本格式。
 * @param fusionType - 目标格式类型，使用 FusionType 枚举值指定转换后的格式（H5、MD、TXT）。
 *
 * @returns 转换后的文本内容，格式为指定的 fusionType。
 *
 * @example
 * // 将 Markdown 文本转换为 HTML
 * const markdownContent = "# Heading\nThis is a paragraph.";
 * const htmlContent = formatInterop(markdownContent, FusionType.H5);
 * console.log(htmlContent); // 输出转换后的 HTML 内容
 *
 * @example
 * // 将 HTML 文本转换为 Markdown
 * const htmlContent = "<h1>Heading</h1><p>This is a paragraph.</p>";
 * const markdownContent = formatInterop(htmlContent, FusionType.MD);
 * console.log(markdownContent); // 输出转换后的 Markdown 内容
 *
 * @example
 * // 将 Markdown 文本转换为纯文本
 * const markdownContent = "# Heading\nThis is a paragraph.";
 * const plainTextContent = formatInterop(markdownContent, FusionType.TXT);
 * console.log(plainTextContent); // 输出转换后的纯文本内容
 */
export function formatInterop(content: string, fusionTarget: FusionType): string {
  let currentFusionType = detectTextFormat(content);
  if (FusionType.H5 === fusionTarget) {
    return toHtml5(content, currentFusionType);
  }

  if (FusionType.MD === fusionTarget) {
    return toMarkdown(content, currentFusionType);
  }

  if (FusionType.TXT === fusionTarget) {

    return toPlainText(content, currentFusionType);
  }

  // 如果 fusionType 不匹配，返回错误日志
  return `Error: Unsupported fusionType '${fusionTarget}'. Supported types are H5, MD, TXT.`;
}
